<!DOCTYPE html>
<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="content-type">
    <title>ch02-02</title>
    <link href="css/style.css" rel="stylesheet" type="text/css">
    <link rel="stylesheet" href="thumbnailviewer.css" type="text/css">
    <script src="thumbnailviewer.js" type="text/javascript">

/***********************************************
* Image Thumbnail Viewer Script- © Dynamic Drive (www.dynamicdrive.com)
* This notice must stay intact for legal use.
* Visit http://www.dynamicdrive.com/ for full source code
***********************************************/

</script> </head>
  <body>
    <div class="os1">2.2 MinGW 和 MSYS </div>
    <p> 我们上一节安装的就是 MinGW 工具集编译环境和 Qt 开发库，本节介绍 MinGW 是什么， 然后下载与 MinGW 配套使用的辅助系统环境
      MSYS，并进行安装配置。最后介绍一下 Qt 开发库自身的工具。 </p>
    <div class="os2">2.2.1 MinGW</div>
    <br>
    上个世纪八十年代，计算机属于奢侈品，当时的操作系统属 Unix 家族独大，还没微软什么事。这些 Unix
    系统包括内部软件都是专有授权，全是花钱购买的。系统程序员 Richard M. Stallman (RMS) 在此环境下创立了与众不同的 GNU 项目
    (GNU's Not Unix) ， 以及推进自由软件发展的 Free Software Foundation (FSF) 自由软件基金会。 GNU
    项目是为了创建自由的类 Unix 系统，也因此开发出来很多开源的系统工具，其中非常著名的就是 GCC （GNU Compiler
    Collection，GNU编译器套件）。<br>
    &nbsp;MinGW ，全称 “Minimalist GNU for Windows”，含义为 Windows 平台最小化的 GNU
    工具集，该项目将大量编译器相关的代码移植到了 Windows 系统平台，其中最重要的就是本教程从头到尾使用的 GCC 编译器套件。MinGW
    里面常用的工具列表如下：<br>
    <br>
    <table class="tabel">
      <tbody>
        <tr>
          <td style="width: 95px;"><b>gcc</b></td>
          <td> GNU C 语言编译器（大写的 GCC 指全部编译套件，小写的 gcc 指 C 语言编译器）。 </td>
        </tr>
        <tr class="d1">
          <td style="width: 95px;"><b>g++</b></td>
          <td> GNU C++ 语言编译器。 </td>
        </tr>
        <tr>
          <td style="width: 95px;"><b>ld</b></td>
          <td> GNU 链接器，将目标文件和库文件链接起来，创建可执行程序和动态链接库。 </td>
        </tr>
        <tr class="d1">
          <td style="width: 95px;"><b>ar</b></td>
          <td> 生成静态库 .a ，可以编辑和管理静态链接库。 </td>
        </tr>
        <tr>
          <td style="width: 95px;"><b>make</b></td>
          <td> 生成器，可以根据 makefile 文件自动编译链接生成可执行程序或库文件。 </td>
        </tr>
        <tr class="d1">
          <td style="width: 95px;"><b>gdb</b></td>
          <td> 调试器，用于调试可执行程序。 </td>
        </tr>
        <tr>
          <td style="width: 95px;"><b>ldd</b></td>
          <td> 查看可执行文件依赖的共享库（扩展名 .so，也叫动态链接库）。 </td>
        </tr>
      </tbody>
    </table>
    <br>
    ldd 是 Linux/Unix 系统查看链接库依赖的工具，在 Windows 系统，有类似的工具 <a href="http://www.dependencywalker.com/"
      target="new"> Dependency Walker </a>，将 exe或dll 拖到该程序界面就会自动分析依赖的动态库。<br>
    <br>
    Qt 安装包里面带有 MinGW，上一节已经安装过了，就不需要单独下载安装 MinGW 工具集了。我们对 VC 编译器和 MinGW GCC
    编译器做一个简单对比：<br>
    <br>
    <table class="tabel">
      <tbody>
        <tr class="d1">
          <td style="width: 20%"><b>对比项</b><br>
          </td>
          <td style="width: 40%"><b>MinGW 系列名称</b></td>
          <td> <b>VC 系列名称 </b></td>
        </tr>
        <tr>
          <td style="width: 20%">C 语言编译器<br>
          </td>
          <td style="width: 40%">gcc.exe</td>
          <td> cl.exe </td>
        </tr>
        <tr class="d1">
          <td style="width: 20%">C++ 语言编译器<br>
          </td>
          <td style="width: 40%">g++.exe</td>
          <td> cl.exe </td>
        </tr>
        <tr>
          <td style="width: 20%">链接器<br>
          </td>
          <td style="width: 40%">ld.exe</td>
          <td> link.exe </td>
        </tr>
        <tr class="d1">
          <td style="width: 20%">头文件和源代码文件名<br>
          </td>
          <td style="width: 40%">*.h, *.c, *.cpp<br>
          </td>
          <td> *.h, *.c, *.cpp </td>
        </tr>
        <tr>
          <td style="width: 20%">引用库和静态库文件名<br>
          </td>
          <td style="width: 40%">*.a<br>
          </td>
          <td> *.lib<br>
          </td>
        </tr>
        <tr class="d1">
          <td style="width: 20%">引用库和静态库工具 </td>
          <td style="width: 40%">ar.exe<br>
          </td>
          <td> lib.exe<br>
          </td>
        </tr>
        <tr>
          <td style="width: 20%">动态库文件名 </td>
          <td style="width: 40%">*.dll<br>
          </td>
          <td> *.dll<br>
          </td>
        </tr>
        <tr class="d1">
          <td style="width: 20%">集成开发环境 </td>
          <td style="width: 40%">QtCreator 等，使用 gdb.exe 调试程序<br>
          </td>
          <td> Visual Studio，自带调试功能<br>
          </td>
        </tr>
        <tr>
          <td style="width: 20%">代码构建工具 </td>
          <td style="width: 40%">mingw32-make.exe<br>
          </td>
          <td> nmake.exe<br>
          </td>
        </tr>
      </tbody>
    </table>
    <br>
    注意 MinGW GCC 和 VC 的 C 语言动态库 *.dll 是互相兼容的，可以相互调用。但是二者的 C++ 语言动态库 *.dll
    是不兼容的，因为 C++ 有函数重载和类函数，GCC 对重载函数名、类函数的处理与 VC 不一样，编译生成的最终函数名不一样，因此不兼容。<br>
    <br>
    关于 GNU、MinGW 详细信息请查看网站：<br>
    GNU 项目主页： <a href="http://www.gnu.org/" target="new">http://www.gnu.org/</a>
    <br>
    MinGW 主页：<a href="http://www.mingw.org/" target="new">http://www.mingw.org/</a>
    <br>
    Mingw-w64 主页：<a href="https://sourceforge.net/projects/mingw-w64/" target="new">https://sourceforge.net/projects/mingw-w64/</a>
    <br>
    <br>
    这里说明一下，MinGW 官方版本仅支持构建 32 bit Windows 程序，Mingw-w64 是其衍生项目，同时支持 32 bit 和 64
    bit Windows 程序构建，Mingw-w64 比原版的 MinGW 应用更广泛，其实 Qt 开发环境集成的就是 Mingw-w64 工具集。Qt
    集成的 Mingw-w64 工具集只有 32 位版本，安装路径为：<br>
    <b>C:\Qt\Qt5.4.0\Tools\mingw491_32 </b><br>
    <br>
    对于该工具集，QtCreator 使用的头文件、库文件、可执行文件路径如下：<br>
    C:\Qt\Qt5.4.0\Tools\mingw491_32\i686-w64-mingw32\include<br>
    C:\Qt\Qt5.4.0\Tools\mingw491_32\i686-w64-mingw32\lib<br>
    C:\Qt\Qt5.4.0\Tools\mingw491_32\bin <br>
    比较特殊的就是头文件、库文件路径，多带了一层文件夹<b> i686-w64-mingw32</b> ，以后我们编译安装 Xiph.Org
    代码库时，需要将 *.h 和 *.a 手动复制一下，放到 i686-w64-mingw32 文件夹里面的 include 和 lib 子文件夹。<br>
    <br>
    <div class="os2">2.2.2 MSYS</div>
    <br>
    在 Linux 系统编译过程序源代码的同学，一般知道编译生成目标程序或库的三板斧：<br>
    <br>
    <b> ./configure<br>
      make<br>
      make install<br>
    </b> <br>
    第一句命令是检查构建环境并进行配置；第二句命令是构建目标程序或库，第三句命令是将生成好的目标程序或库安装到系统里。上面的命令通常依赖
    Linux/Unix 系统的命令行工具实现。为了方便跨平台编译程序，MinGW 项目组顺便也将 Linux/Unix 系统的命令行工具移植到了
    Windows 系统，即 MSYS（Minimal SYStem）。<br>
    MSYS 里面包含了构建程序常用的工具，包括 bash、make、gawk、grep 等等，将 MSYS 和 MinGW 组合之后，在 Windows
    系统也能使用三板斧构建目标程序和库了。当然，需要项目源代码里说明了能在 Windows 系统里面编译，才可以用三板斧，如果项目本身不支持 Windows
    和 MinGW，那也有无奈的时候。本教程使用的开发库和示例代码当然都是可以在 MSYS + MinGW + Qt 环境里面编译的。<br>
    <br>
    MSYS 官网为：<br>
    <a href="http://www.mingw.org/wiki/MSYS" target="new">http://www.mingw.org/wiki/MSYS</a>
    <br>
    MinGW 官方提供的 MSYS 下载比较麻烦，是一个下载工具单独勾选模块来安装。我们有更方便的 All-In-One 合集包，在网盘可以下载到：<br>
    <a href="https://pan.baidu.com/s/1sOFrkti69SCIb-hAZEfOXw" target="new">https://pan.baidu.com/s/1sOFrkti69SCIb-hAZEfOXw</a><br>
    <center><img src="images/ch02/ch02-02-01.jpg"></center>
    <br>
    安装包的国外网站下载链接：<br>
    <a href="https://sourceforge.net/projects/mingwbuilds/files/external-binary-packages/"
      target="new">https://sourceforge.net/projects/mingwbuilds/files/external-binary-packages/</a><br>
    <a href="https://sourceforge.net/projects/mingw-w64/files/External%20binary%20packages%20%28Win64%20hosted%29/MSYS%20%2832-bit%29/"
      target="new">https://sourceforge.net/projects/mingw-w64/files/External%20binary%20packages%20%28Win64%20hosted%29/MSYS%20%2832-bit%29/</a><br>
    <br>
    我们下载<span style="color: red"><b>
        msys+7za+wget+svn+git+mercurial+cvs-rev13.7z </b></span> 这个合集包，然后解压到
    C:\ 根目录：<br>
    <center><img src="images/ch02/ch02-02-02.jpg"></center>
    我们双击 msys.bat ，运行后看到命令行界面：<br>
    <center><img src="images/ch02/ch02-02-03.jpg"></center>
    这仅仅是 MSYS 命令行，还没有与 MinGW 做集成，在上图命令行里面执行关键的一句命令：<br>
    <div class="clroot"> mount&nbsp; C:/Qt/Qt5.4.0/Tools/mingw491_32&nbsp;
      /mingw</div>
    注意把路径分隔符全改成右斜杠 / ，MinGW 安装路径写成 C:/Qt/Qt5.4.0/Tools/mingw491_32 ，按回车键执行上面的命令。<br>
    如果不知道如何在 MSYS 命令行粘贴命令，参考下图，右击命令行标题，菜单“编辑”--&gt; “粘贴”即可：<br>
    <center><img src="images/ch02/ch02-02-04.jpg"></center>
    执行命令行之后，我们执行命令&nbsp; gcc -v ，可以看到如下信息：<br>
    <center><img src="images/ch02/ch02-02-05.jpg"></center>
    这样 MSYS 和 MinGW 集成就成功了。mount 命令是将 MinGW 安装路径映射到 MSYS 的虚拟路径 /mingw ，以后都可以通过
    /mingw 路径访问 MinGW 工具。mount 命令会在 C:\msys\etc 文件夹生成一个 fstab 文件，里面内容如下：<br>
    <div class="code">C:/Qt/Qt5.4.0/Tools/mingw491_32&nbsp;&nbsp;&nbsp;&nbsp;
      /mingw </div>
    根据这个配置文件，以后 MSYS 命令行每次启动都会自动加载 MinGW 了。可以将 C:\msys\msys.bat
    脚本的快捷方式发送到桌面，以后方便使用 MSYS。<br>
    <br>
    <div class="os2">2.2.3 Qt工具集</div>
    <br>
    如果仅仅是生成命令行程序，那么 MSYS + MinGW 够用了，然而实际上在开发项目时，更多地需要用到图形界面，因此本教程挑选 Qt
    作为图形界面开发库，Qt
    不仅仅包括图形界面开发功能，还有网络通信、音视频采集播放、数据库、打印机等非常多的功能，并且原生地支持跨平台开发，这也是非常优良的特性。使用 Qt
    库的软件越来越多了，比如 WPS Linux 版本，Foxit Reader 在 Linux 下版本，甚至 Windows
    系统里的网易对战平台、11对战平台也都采用 Qt 开发。<br>
    <br>
    Qt 官方的开发环境安装包里有自己专门的开发工具，之前看到过 qmake.exe 。 qmake 是 Qt 开发最核心的工具，既可以生成 Qt 项目文件
    .pro ， 也可以自动生成项目的 Makefile 文件。这里将常用的 Qt 开发工具列表如下：<br>
    <br>
    <table class="tabel">
      <tbody>
        <tr>
          <td style="width: 95px;"><b>qmake</b></td>
          <td> 核心的项目构建工具，可以生成跨平台的 .pro 项目文件，并能依据不同操作系统和编译工具生成相应的
            Makefile，用于构建可执行程序或链接库。 </td>
        </tr>
        <tr class="d1">
          <td style="width: 95px;"><b>uic</b></td>
          <td> User Interface Compiler，用户界面编译器，Qt 使用 XML 语法格式的 .ui 文件定义用户界面，uic
            根据 .ui 文件生成用于创建用户界面的 C++ 代码头文件，比如 ui_*****.h 。 </td>
        </tr>
        <tr>
          <td style="width: 95px;"><b>moc</b></td>
          <td> Meta-Object Compiler，元对象编译器，moc 处理 C++ 头文件的类定义里面的 Q_OBJECT
            宏，它会生成源代码文件，比如 moc_*****.cpp ，其中包含相应类的元对象代码，元对象代码主要用于实现 Qt
            信号/槽机制、运行时类型定义、动态属性系统。 </td>
        </tr>
        <tr class="d1">
          <td style="width: 95px;"><b>rcc</b></td>
          <td> Resource Compiler，资源文件编译器，负责在项目构建过程中编译 .qrc 资源文件，将资源嵌入到最终的 Qt
            程序里。 </td>
        </tr>
        <tr>
          <td style="width: 95px;"><b>qtcreator</b></td>
          <td> 集成开发环境，包含项目生成管理、代码编辑、图形界面可视化编辑、 编译生成、程序调试、上下文帮助、版本控制系统集成等众多功能，
            还支持手机和嵌入式设备的程序生成部署。 </td>
        </tr>
        <tr class="d1">
          <td style="width: 95px;"><b>assistant</b></td>
          <td> Qt 助手，帮助文档浏览查询工具，Qt 库所有模块和开发工具的帮助文档、示例代码等都可以检索到，是 Qt
            开发必备神器，也可用于自学 Qt。 </td>
        </tr>
        <tr>
          <td style="width: 95px;"><b>designer</b></td>
          <td> Qt 设计师，专门用于可视化编辑图形用户界面（所见即所得），生成 .ui 文件用于 Qt 项目。 </td>
        </tr>
        <tr class="d1">
          <td style="width: 95px;"><b>linguist</b></td>
          <td> Qt 语言家，代码里用 tr() 宏包裹的就是可翻译的字符串，开发人员可用 lupdate 命令生成项目的待翻译字符串文件
            .ts，用 linguist 翻译多国语言 .ts ，翻译完成后用 lrelease 命令生成 .qm
            文件，然后就可用于多国语言界面显示。 </td>
        </tr>
        <tr>
          <td style="width: 95px;"><b>qmlscene</b></td>
          <td> 在 Qt 4.x 里是用 qmlviewer 进行 QML 程序的原型设计和测试，Qt 5 用 qmlscene 取代了旧的
            qmlviewer。新的 qmlscene 另外还支持 Qt 5 中的新特性 scenegraph 。 </td>
        </tr>
      </tbody>
    </table>
    <br>
    上表的命令在 Qt 命令行里可以使用，Qt 工具集所在路径为：C:\Qt\Qt5.4.0\5.4\mingw491_32\bin 。<br>
    注意这里说的 Qt 命令行是指开始菜单里的 Qt 5.4 for Desktop (MinGW 4.9 32 bit) 命令行，不是 MSYS
    命令行。MSYS 命令行只在编译开发库本身的时候使用，开发库编译安装好之后，就不需要用 MSYS 了。<br>
    <br>
    读者可以学习一下《Qt 编程指南》第二章的内容，里面有讲解命令行编译 C++ 和 Qt 程序。虽然本节提到的工具很多，但是后面主要用的就是集成开发环境
    QtCreator，除了编译 Xiph.Org 开发库时用到 MSYS 命令行，其他绝大多数时候都是用 QtCreator 编写程序。<br>
    <br>
    <br>
    <br>
    <table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
      <tbody>
        <tr>
          <td style="width: 40%;">
            <div style="text-align: center;"><a href="ch02-01.htm"><img class="pic"
                  style="width: 32px; height: 32px;" alt="prev" src="images/pics/prev.png"></a></div>
          </td>
          <td style="width: 20%;">
            <div style="text-align: center;"><a href="contents.htm"><img class="pic"
                  style="width: 32px; height: 32px;" alt="contents" src="images/pics/contents.png"></a></div>
          </td>
          <td style="width: 40%;">
            <div style="text-align: center;"><a href="ch03-00.htm"><img class="pic"
                  style="width: 32px; height: 32px;" alt="next" src="images/pics/next.png"></a></div>
          </td>
        </tr>
      </tbody>
    </table>
  </body>
</html>
